#ifndef __CLIENT_H__
#define __CLIENT_H__
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
#include <dirent.h>
#include <string.h>
#include <time.h>
#include <grp.h>
#include <pwd.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/select.h>
#include <sys/time.h>
#include <strings.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/sem.h>
#include <sys/msg.h>
#include <signal.h>
#include <pthread.h>
#include <errno.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <sys/epoll.h>
//文件名及行号的打印是放在这里

#define ARGS_CHECK(argc,num) {if(argc!=num) {printf("error args\n");return -1;}}
#define ERROR_CHECK(ret,retval,func_name) {if(ret==retval) {printf("%s:%d---",__FILE__,__LINE__);fflush(stdout);perror(func_name);return -1;}}
#define THREAD_ERR_CHECK(ret,func_name) {if(ret!=0) {printf("%s failed,%d %s\n",func_name,ret,strerror(ret));return -1;}}
#define SELFFUNC_ERR_CHECK(ret,func_name) {if(ret!=0) {printf("%s failed\n",func_name);return -1;}}

#define LOG(info) printf("%s:%d---%s\n",__FILE__,__LINE__,info);
#define READ_DATA_SIZE	1024
#define MD5_SIZE		16
#define MD5_STR_LEN		(MD5_SIZE * 2)
#define SALT_LEN 15
enum command{
    REGISTER=1,
    LOGIN,
    LS,
    CD,
    PWD,
    REMOVE,
    GETS,
    PUTS,
    TOKEN,
    LOGINFAIL,
    SAVEOK,         //秒传的状态
    OFF_T,          //断点续传所需的偏移量
    MD5,
};

typedef struct{
    int data_len;//存放buf，也就是火车车厢中数据长度
    char buf[1000];//火车车厢长度
}train_t;

//带有状态码的火车
typedef struct{
    int data_len;//存放buf，也就是火车车厢中数据长度
    int state;//状态码
    char buf[1000];//火车车厢长度
}train_state_t;
//用来断点续传的小火车
typedef struct{
    int data_len;
    int state;
    off_t file_off;
}train_off_t;

typedef struct{
    struct sockaddr_in ser_addr;
    socklen_t len_of_ser_addr;
    int notification;
    char token[25];
    char command[200];//放的是 gets file,  或者puts file
}Thread_Info_t;
#endif